home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LIBRARY / PAS_0693 / CSTR.PAS < prev    next >
Pascal/Delphi Source File  |  1993-06-30  |  4KB  |  114 lines

  1. {─ Fido Pascal Conference ────────────────────────────────────────────── PASCAL ─
  2. Msg  : 402 of 413
  3. From : Todd Holmes                         1:152/5.0            25 Jun 93  10:23
  4. To   : All
  5. Subj : Unit Cstr: Nul term strings for streams
  6. ────────────────────────────────────────────────────────────────────────────────}
  7. Unit Cstr;
  8.  
  9. {Unit CStr
  10.  by Todd Holmes
  11.  Created: 6/21/93
  12.  Last Modified: Never
  13.  
  14.  Tested
  15.  
  16.  Cstr is a unit to suppliment the writing and reading of Nul terminating
  17.  strings to and from Streams. Cstr also offers conversion from Pascal strings
  18.  to Nul term Strings.
  19.  
  20.  Future Improvements: Error checking needs to be expanded
  21.                       Turn it into an Object}
  22.  
  23. {$O+,X+,F+}         {Allow unit to be overlaid, extented syntax (required for
  24.                     using the Strings Unit, Force Far calls}
  25. Interface
  26.  
  27. Uses Strings, Objects;
  28.  
  29. Const
  30.  
  31.   MaxCstrLen = 65528; {max amount in bytes that can be allocated on the heap}
  32.   MaxPstrLen = 256;   {Max length of a pascal style string}
  33.  
  34. Var
  35.  
  36.    MaxLen: Word; {Defines the maximum size of a nul string that can
  37.                     be read from a stream. The unit sets this to MaxPStrLen
  38.                     by default, but if you want to read in longer strings from
  39.                     a stream, this value may not be larger the MaxCstrLen}
  40.  
  41. Procedure StoreCstr( Var S:TStream; Cstr: PChar);
  42. {Writes Nul terminating String to a stream}
  43.  
  44. Procedure StorePstr(VAr S:TStream; PStr: STring);
  45. {Converts a Pas string to a nul term str and writes to a stream}
  46.  
  47.  
  48. Function LoadCStr(Var S:TStream): PChar;
  49. {Loads a Nul term String from a stream, assumes the stream is positioned
  50.  at the start of the string to be read in}
  51.  
  52. Function LoadPStr(Var S: TStream):String;
  53. {Loads a Nul term string and converts it to a Pascal string}
  54.  
  55.  
  56.  
  57. Implementation
  58. Procedure StoreCstr( Var S:TStream; Cstr: PChar);
  59. {Writes Nul terminating String to a stream}
  60.  begin
  61.    S.Write(Cstr^,Strlen(Cstr)+1);
  62.  end;
  63.  
  64. Procedure StorePstr(VAr S:TStream; PStr: STring);
  65. var
  66.  Cstr: PChar;
  67.  begin
  68.    Getmem(Cstr,Length(Pstr)+1);   {Allocate memory on the heap}
  69.    StrPCopy(CStr,Pstr);           {Strings Unit: Converts Pstr to CStr}
  70.    StoreCstr(S,Cstr);             {Stores the CStr}
  71.    FreeMem(Cstr,Length(Pstr)+1);  {Frees up the Allocated memory}
  72.  end;
  73.  
  74. Function LoadCStr(Var S:TStream): PChar;
  75. var
  76.  Start,Stop: LongInt;
  77.  L: Word;
  78.  Buf: Char;
  79.  CStr: PChar;
  80. begin
  81.   Start := S.GetPos;
  82.   Repeat              {Scan for end of string, (nul term char: #0)}
  83.     S.Read(Buf,1);    {no need for a larger buffer, since were using
  84.                        TBufStream with a 1 k buffer}
  85.   Until Buf = #0;
  86.   Stop := S.GetPos;
  87.   if (stop - Start) > MaxLen then LoadCStr := Nil {string is to big!}
  88.                       {Needs additon error checking here}
  89.   Else
  90.     begin
  91.      L := Stop - Start; {Get Length of string, include nul terminator}
  92.      GetMem(CStr,L);    {Allocate memory}
  93.      S.Seek(Start);     {repostion}
  94.      S.Read(CStr^,L);   {Read the string}
  95.      LoadCStr := CStr;
  96.     end;
  97. end; {LoadCstr}
  98.  
  99. Function LoadPStr(Var S: TStream):String;
  100. {Loads a Nul term string and converts it to a Pascal string}
  101. var
  102.  PStr : String;
  103.  CStr : PChar;
  104.  begin
  105.    CStr := LoadCStr(S);           {Loads a nul term string}
  106.    If CStr  = nil then PStr := ''
  107.    Else PStr := StrPas(CStr);     {Converts CStr to a Pascal String}
  108.    LoadPStr := PStr;
  109.  end;
  110.  
  111. begin
  112.   MaxLen := MaxPStrLen; {Set default CStr Length, your program should set
  113.                         this to any value less then MaxCStrLen}
  114. end.